์์ฑ: 2026-03-04 04:03:38์์ : 2026-03-04 04:03:38
๋ฐฑ์๋ ํ์ ๋์์ธ ํจํด ๊ฐ์ด๋: ์์ ๋ก ๋ฐฐ์ฐ๋ ํจ์จ์ ์ธ ์ค๊ณ
๋์์ธ ํจํด์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ค์ ๋ํ '๊ฒ์ฆ๋ ํด๊ฒฐ์ฑ '์ ๋๋ค. ๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ๋์์ธ ํจํด์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ ๋ฎ์ถ๋ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ฉ๋๋ค.
1. ์์ฑ ํจํด (Creational Patterns)
๊ฐ์ฒด ์์ฑ ๋ก์ง์ ์บก์ํํ์ฌ ์์คํ ์ ์ ์ฐ์ฑ์ ๋์ด๋ ํจํด์ ๋๋ค.
โ ์ฑ๊ธํค ํจํด (Singleton)
- ์ค๋ช : ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋จ ํ๋๋ง ์์ฑํ๊ณ ์ด๋์๋ ๊ทธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค.
- DB ๊ด๋ จ ์์: Database Connection Pool (HikariCP). DB ์ฐ๊ฒฐ์ ๋น์ฉ์ด ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์, ์ปค๋ฅ์ ํ ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ํฉ๋๋ค.
- ์ฝ๋ ์์:
@Configuration public class DbConfig { @Bean @Primary // ๋จ ํ๋์ DataSource๋ง ์์ฑํ์ฌ ๊ณต์ public DataSource dataSource() { return new HikariDataSource(); } }
โก ๋น๋ ํจํด (Builder)
- ์ค๋ช : ๋ณต์กํ ๊ฐ์ฒด์ ์์ฑ ๊ณผ์ ๊ณผ ํํ ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํฉ๋๋ค.
- DB ๊ด๋ จ ์์: QueryDSL / jOOQ ์ฟผ๋ฆฌ ์์ฑ. ๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฅผ ์๋ฐ ์ฝ๋๋ก ์กฐ๋ฆฝํ ๋ ๋น๋ ํจํด์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฝ๋ ์์:
// QueryDSL ์์: ๋น๋ ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์กฐ๋ฆฝ List<User> users = queryFactory .selectFrom(user) .where(user.age.gt(18)) .orderBy(user.name.asc()) .fetch();
2. ๊ตฌ์กฐ ํจํด (Structural Patterns)
โ ์ด๋ํฐ ํจํด (Adapter)
- ์ค๋ช : ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ฐ์์ ์ฐ๊ฒฐํด ์ค๋๋ค.
- DB ๊ด๋ จ ์์: JDBC (Java Database Connectivity). ์๋ฐ๋ ํ๋์ธ๋ฐ DB๋ MySQL, Oracle, PostgreSQL ๋ฑ ๋ค์ํฉ๋๋ค. ๊ฐ DB ๋๋ผ์ด๋ฒ๊ฐ JDBC๋ผ๋ ํ์ค ์ธํฐํ์ด์ค์ ๋ง์ถฐ '์ด๋ํฐ' ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ DB๊ฐ ๋ฐ๋์ด๋ ๊ฐ์ ์๋ฐ ์ฝ๋๋ฅผ ์ธ ์ ์์ต๋๋ค.
โก ํ๋ก์ ํจํด (Proxy)
- ์ค๋ช : ์ค์ ๊ฐ์ฒด ์ ๊ทผ ์ ํ์ ๋ก์ง์ ์ถ๊ฐํฉ๋๋ค.
- DB ๊ด๋ จ ์์: JPA ์ง์ฐ ๋ก๋ฉ (Lazy Loading). ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๊ฐ์ ธ์ค์ง ์๊ณ , ์ค์ ์ฌ์ฉํ ๋๊น์ง '๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด'๋ฅผ ์ธ์๋ก๋๋ค. ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์๊ฐ ํ๋ก์๊ฐ DB์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค ๋ฐ์ดํฐ๋ฅผ ์ฑ์์ต๋๋ค.
3. ํ์ ํจํด (Behavioral Patterns)
โ ์ ๋ต ํจํด (Strategy)
- ์ค๋ช : ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ผ๋ก ๊ต์ฒดํฉ๋๋ค.
- DB ๊ด๋ จ ์์: ๋ค์ค DB ๋ผ์ฐํ (Master/Slave ๋ถ๊ธฐ). ์๋น์ค ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ฐ๊ธฐ ์์ ์ Master DB๋ก, ์ฝ๊ธฐ ์์ ์ Slave DB๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. ์ด๋ ํ์ฌ ํธ๋์ญ์ ์ ์ํ์ ๋ฐ๋ผ DB ์ฐ๊ฒฐ ์ ๋ต์ ์ ํํฉ๋๋ค.
- ์ฝ๋ ์์:
public class RoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // ํ์ฌ ํธ๋์ญ์ ์ด ReadOnly๋ฉด SLAVE, ์๋๋ฉด MASTER ๋ฐํ return TransactionSynchronizationManager.isCurrentTransactionReadOnly() ? "SLAVE" : "MASTER"; } }
4. ๋ฐฑ์๋ ์ํคํ ์ฒ ํจํด (Architectural Patterns)
๋ฆฌํฌ์งํ ๋ฆฌ ํจํด (Repository Pattern)
- ์ค๋ช : ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ DB ์ ์ฅ์ ์ฌ์ด์ ์ค์ฌ์ ์ญํ ์ ํฉ๋๋ค.
- DB ๊ด๋ จ ์์: Spring Data JPA Repository. ์๋น์ค ๋ ์ด์ด์์๋ ์ด ์ธํฐํ์ด์ค๋ง ๋ฐ๋ผ๋ณด๊ณ , ๋ฐ์ดํฐ๊ฐ ์ค์ MySQL์ ์๋์ง ๋ฉ๋ชจ๋ฆฌ(H2)์ ์๋์ง๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
- ์ด์ : ํ ์คํธ ์์๋ ๊ฐ์ง DB(Mock)๋ฅผ ์ฃผ์ ํ๊ณ , ์ด์ ์์๋ ์ค์ DB๋ฅผ ์ฃผ์ ํ์ฌ ์ฝ๋ ์์ ์์ด ํ๊ฒฝ์ ์ ํํ ์ ์์ต๋๋ค.
5. ์์ฝ ๋ฐ ์ฃผ์์ฌํญ
- ํจํด์ ๋ชฉ์ ์ด ์๋ ์๋จ์ ๋๋ค: ์ฝ๋๋ฅผ ํจํด์ ์ต์ง๋ก ๋ผ์ ๋ง์ถ๋ '์ค๋ฒ์์ง๋์ด๋ง'์ ๊ฒฝ๊ณํด์ผ ํฉ๋๋ค.
- ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์: ํจํด์ ์ฐ๋ ์ด์ ๋ ๋์ค์ ์ฝ๋๋ฅผ ๊ณ ์น๊ธฐ ์ฝ๊ฒ ํ๊ธฐ ์ํด์์ ๋๋ค.
- ์คํ๋ง๊ณผ์ ์กฐํ: ์๋ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์คํ๋ง๊ณผ JPA๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ํจํด์ ์ฌ์ฉํ์ฌ DB ํต์ ์ ํจ์จํํ๋์ง(Connection Pool, Proxy, Repository ๋ฑ) ์ดํดํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.